
'''
单一移动平均策略 Single Moving Average 
当股价上升且向上穿过N日的均线时，说明股价在向上突破，此时下单买入；
当股价下降且乡下穿过N日均线时，说明股价整体出现下跌趋势，此时卖出；

或当M日均价上升穿过N日的均线时（M<N）,说明股票处于上升趋势，应下单买入；
反之，当M日均价格下降且穿过N日均线时，说明股票处于下降趋势，应卖出。
'''

import pandas as pd
import numpy as np
from chapter_2_get import gen_stock_data_table
import matplotlib.pyplot as plt

stock_data = gen_stock_data_table('002419', '20220101', '20221231')
stock_002419 = stock_data['stock']
# 使用10日均线
period = 10

# 设置一个空表，用来存储每10天的价格
avg_10 = []

# 设置一个空列表，用来存储每10天价格的均值
avg_value = []

# 设置一个循环
for price in stock_002419['close']:
    # 每天的价格传入avg_10
    avg_10.append(price)
    # 当列表中存储的数多余10个
    if len(avg_10) > period:
        # 就把前面传入的价格数据删除，确保列表中最多只有10天的数据
        del avg_10[0]
    # 将计算好的每个10日均价写入股票价格数据表中
    # np.mean() 求平均值
    avg_value.append(np.mean(avg_10))
# pd.Series创建一维数组，index 为stock_002419的index
# stock_002419.assign() 增加一个列
stock_002419_avg = stock_002419.assign(
    avg_10=pd.Series(avg_value, index=stock_002419.index)
)
print('avg:', stock_002419_avg)


# 可视化

plt.figure(figsize=(10, 6))
# 绘制股价变化
plt.plot(stock_002419_avg['close'],  '-', lw=2, c='r', label='price')

# 绘制10日均线
plt.plot(stock_002419_avg['avg_10'], '--', lw=2, c='b', label='avg_10')

# 添加图注和网格
# plt.legend()
plt.grid()
plt.show()
